C++ স্ট্যান্ডার্ড লাইব্রেরি বিভিন্ন ধরণের ইটরেটর (Iterators) সরবরাহ করে, যা কনটেইনারের উপাদানগুলোতে অ্যাক্সেস করতে ব্যবহৃত হয়। ইটরেটরগুলো পয়েন্টারের মতো কাজ করে এবং কনটেইনারের উপাদানগুলোর মধ্য দিয়ে চলাচল করতে সাহায্য করে। এগুলোর মধ্যে প্রধান পার্থক্য হল এগুলোর অ্যাক্সেসের ক্ষমতা এবং যেখানে ব্যবহার করা যায়। সেগুলোর মধ্যে Input Iterators, Output Iterators, Forward Iterators, Bidirectional Iterators, এবং Random Access Iterators অন্তর্ভুক্ত।
এখানে এই ইটরেটরগুলো বিস্তারিতভাবে আলোচনা করা হলো:
Input Iterator হল এমন একটি ইটরেটর যা শুধুমাত্র কনটেইনারের উপাদানগুলোকে পড়তে পারে। এটি একপথে, শুধুমাত্র একবার ভ্রমণ করতে সক্ষম, অর্থাৎ আপনি ইটরেটরের মাধ্যমে কেবল একটি উপাদান পড়তে পারবেন এবং পুনরায় সেই উপাদানটি অ্যাক্সেস করতে পারবেন না। এটি ডেটা পড়া বা ইনপুট স্ট্রিমে ব্যবহৃত হয়।
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// Input iterator ব্যবহার করে উপাদানগুলো পড়া
std::vector<int>::iterator it = vec.begin();
std::cout << *it << std::endl; // 1
return 0;
}
এখানে, it
কেবলমাত্র একটি উপাদান পড়তে সক্ষম।
Output Iterator হল এমন একটি ইটরেটর যা কেবল কনটেইনারের উপাদানগুলোতে লেখা (write) করতে পারে, কিন্তু এটি পড়তে সক্ষম নয়। এই ইটরেটরের মাধ্যমে আপনি কেবল ডেটা লিখতে পারবেন।
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec(5);
// Output iterator ব্যবহার করে মান লিখা
std::vector<int>::iterator it = vec.begin();
*it = 10; // প্রথম উপাদানে মান ১০ লিখা
std::cout << vec[0] << std::endl; // আউটপুট হবে 10
return 0;
}
এখানে, it
কেবল একটি উপাদান লিখতে সক্ষম।
Forward Iterator হল এমন একটি ইটরেটর যা কনটেইনারের উপাদানগুলোকে একপথে ভ্রমণ করতে পারে এবং উপাদানগুলোর মান পরিবর্তন করতে বা পড়তে সক্ষম। এটি একাধিক বার চলতে পারে, কিন্তু শুধুমাত্র একপথে। এই ইটরেটরটি সাধারনত লিংকড লিস্ট এবং অন্যান্য ধারাবাহিক কনটেইনারের জন্য ব্যবহৃত হয়।
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
// Forward iterator ব্যবহার করে উপাদানগুলো প্রিন্ট করা
for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
এখানে, it
উপাদানগুলো একপথে একাধিক বার পড়তে সক্ষম।
Bidirectional Iterator হল এমন একটি ইটরেটর যা কনটেইনারের উপাদানগুলোকে দুই দিক (Forward এবং Backward) ভ্রমণ করতে সক্ষম। এটি সাধারণত ডাবল লিঙ্কড লিস্টের জন্য ব্যবহার করা হয়, কারণ ডাবল লিঙ্কড লিস্টে পূর্ববর্তী এবং পরবর্তী উপাদানগুলোতে প্রবেশ করা যায়।
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
// Bidirectional iterator ব্যবহার করে উপাদানগুলো প্রিন্ট করা
std::list<int>::iterator it = lst.begin();
std::cout << *it << " "; // প্রথম উপাদান
++it;
std::cout << *it << " "; // দ্বিতীয় উপাদান
--it;
std::cout << *it << std::endl; // প্রথম উপাদান
return 0;
}
এখানে, it
ইটরেটরটি প্রথমে সামনে, তারপর পিছনে চলাচল করছে।
Random Access Iterator হল সবচেয়ে শক্তিশালী ইটরেটর, যা কনটেইনারের উপাদানগুলোর মধ্যে যেকোনো অবস্থানে যেতে সক্ষম। এটি কনটেইনারের উপাদানগুলোর প্রতি এলোমেলো অ্যাক্সেস প্রদান করে এবং দ্রুততম ভ্রমণ (constant time) নিশ্চিত করে। এটি সাধারণত অ্যারে বা ভেক্টর কনটেইনারের জন্য ব্যবহৃত হয়।
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// Random Access Iterator ব্যবহার করে উপাদানগুলোর অ্যাক্সেস
std::vector<int>::iterator it = vec.begin();
std::cout << *(it + 2) << std::endl; // 30 (যেকোনো অবস্থানে অ্যাক্সেস)
return 0;
}
এখানে, it + 2
দ্বারা এলোমেলোভাবে তৃতীয় উপাদান (30) অ্যাক্সেস করা হয়েছে, যা Random Access Iterator
এর ক্ষমতা।
Iterator Type | Access Type | Movement Direction | Time Complexity |
---|---|---|---|
Input Iterator | Read-only | One-way, single pass | O(1) |
Output Iterator | Write-only | One-way, single pass | O(1) |
Forward Iterator | Read/Write | One-way, multiple passes | O(1) |
Bidirectional Iterator | Read/Write | Two-way (forward & backward) | O(1) |
Random Access Iterator | Read/Write | Random access, two-way | O(1) |
প্রতিটি ইটরেটর তার নিজস্ব ব্যবহারের ক্ষেত্রে উপযুক্ত এবং সঠিক ইটরেটর নির্বাচন প্রোগ্রামের কার্যকারিতা ও দক্ষতা বৃদ্ধি করতে সাহায্য করে।
Read more